package functional;

@FunctionalInterface
interface Functional{
    String goodbye(String arg);
}
interface FunctionNoAnn{
    String goodbye(String arg);
}
public class FunctionalAnnotation {
    public String goodbye(String arg){
        return "Goodbye, "+arg;
    }
    public static void main(String[] args){
        FunctionalAnnotation fa= new FunctionalAnnotation();
        Functional f = fa::goodbye;
        FunctionNoAnn fna = fa::goodbye;
        Functional f1 = a->"goodbye，"+a;

        FunctionNoAnn fnal = a->"Goodbye,"+a;
    }
}

//接口命名规则
//1、只处理对象而非基础类型，名称为Function、Consumer、Predicate等
//参数通过泛型添加。
//2、如果接收到参数是基本类型，命名的第一部分表示如LongConsumer,DoubleFunction,IntPredicate等。
//但是返回基础类型的Supplier接口例外

//3、如果返回基础类型，则用To表示，如ToLongFunction<T>和IntLongFunction.
//4、如果返回值类型与参数类型一致，则是一个运算符，单个参数使用UnaryOperator，两个参数使用BinaryOperator。
//5、如果两个参数且返回的是布尔值则一个谓词Predicate。
//6、如果接收两个参数类型不同，则名称中有一个Bi。

//Runnable
//Supplier
//Callable
//Consumer
//BiConsumer
